5.16. История языка
Fortran
История языка Fortran
Прежде чем рассматривать Fortran как технологический артефакт, необходимо обозначить контекст, в котором он возник. В середине 1950‑х годов программирование цифровых ЭВМ было делом исключительно низкоуровневым: инструкции задавались в машинных кодах или с помощью ассемблеров, тесно привязанных к конкретной архитектуре. Программисты работали с регистрами, адресами памяти, битовыми масками и последовательностями команд, оптимизируя каждый такт процессора вручную. При этом доминирующая задача ЭВМ того времени — не обработка текстов, не управление интерфейсами, а численные расчёты, в первую очередь — для аэрокосмической индустрии, ядерной физики и метеорологии.
Компания IBM, обладавшая на тот момент наиболее развитой линейкой научных вычислительных машин — в частности, IBM 704, — столкнулась с парадоксом: аппаратные возможности машины позволяли выполнять десятки тысяч арифметических операций в секунду, но разработка программ требовала колоссальных трудозатрат и была источником многочисленных ошибок. Программы писались на ассемблере, занимали сотни строк, а их отладка могла занимать недели. Отсюда возникла идея: создать машинно‑независимый, человеко‑читаемый способ описания математических вычислений, который бы автоматически транслировался в эффективный машинный код без существенной потери производительности.
Проект, получивший название Speedcoding, предшествовал Fortran и был реализован Джоном Бэкусом (John W. Backus) в 1953 году как интерпретатор для упрощённого языка математических выражений. Speedcoding продемонстрировал жизнеспособность идеи, но его интерпретируемая природа делала выполнение программ в 10–30 раз медленнее машинного кода — неприемлемый компромисс для научных расчётов. В ответ на это IBM инициировала в 1954 году проект с куда более амбициозной целью: разработать компилируемый язык высокого уровня, сопоставимый по эффективности с ручным кодированием, но при этом — экспрессивный, близкий к математической записи. Руководителем проекта вновь стал Бэкус, и 15 апреля 1954 года была опубликована предварительная спецификация нового языка под рабочим названием Formula Translation.
FORTRAN I (1957): рождение нового подхода
Первая реализация, получившая обозначение FORTRAN I, была завершена в апреле 1957 года и официально выпущена для машины IBM 704. Это событие считается отправной точкой эпохи высокоуровневых языков программирования — не только потому, что Fortran был первым из сохранившихся и массово применённых, но и потому, что он впервые продемонстрировал возможность автоматической оптимизации машинного кода на основе высокоуровневых конструкций.
Архитектурные особенности FORTRAN I
FORTRAN I обладал чрезвычайно компактным, но продуманным синтаксисом, отражающим его узкую предметную область — численные вычисления. Язык поддерживал:
- Три типа данных: целые (
INTEGER), вещественные (REAL— 36‑битный формат с плавающей точкой), и логические (LOGICAL). - Именованные переменные: до шести символов, обязательное начало с букв A–Z (цифры допускались на 2–6 позициях). Переменные, начинающиеся с букв I–N, по умолчанию имели тип
INTEGER, остальные —REAL(это соглашение, известное как implicit typing, сохранялось десятилетиями и до сих пор встречается в legacy‑кодах). - Выражения, максимально приближенные к математическим:
A = B * C + D / E. - Условные переходы через оператор
IF (выражение) N1, N2, N3— трёхветвистый арифметический IF, возвращавший управление на одну из трёх меток в зависимости от знака выражения (отрицательный, ноль, положительный). Это был прямой отклик на потребности численных алгоритмов, где часто требовалась реакция на знак разности или остатка. - Циклы через оператор
DO, с фиксированным синтаксисом:ЗдесьDO 10 I = 1, N10— метка конца цикла. Переменная цикла изменялась с шагом 1, задать иной шаг или динамические границы было невозможно — цикл был строго статическим и поддавался полной компиляторной развёртке. - Подпрограммы —
FUNCTIONиSUBROUTINE. Важно подчеркнуть, что вызов подпрограммы в FORTRAN I не предполагал стека вызовов: параметры передавались исключительно по ссылке, а возврат из подпрограммы происходил к фиксированной точке вызова, что позволяло компилятору размещать локальные переменные в статической области памяти.
Компилятор и его инновации
Революционным аспектом FORTRAN I стал не столько язык, сколько его компилятор — это был первый в истории программный продукт, решавший задачу глобальной оптимизации. Компилятор анализировал граф потока управления, строил таблицы живых переменных, выявлял инварианты циклов и применял strength reduction (замена умножения на сложение при вычислении адресов), common subexpression elimination, loop unrolling и register allocation — при том, что сама терминология этих методов появилась лишь спустя десятилетия.
Особый интерес представляет метод кодогенерации: компилятор делил программу на базовые блоки (sequences of straight-line code), строил flow graph, затем — dependence graph, и уже на его основе принимал решения о размещении переменных в регистрах индекса и аккумуляторах. Эффективность получаемого кода была настолько высока, что многие программисты, сначала скептически настроенные, признали: ручное программирование на ассемблере уступает по производительности автоматически сгенерированному коду, особенно в контексте сложных вложенных циклов.
Согласно отчётам IBM, программы, переписанные с ассемблера на FORTRAN I, демонстрировали снижение времени разработки в 20 раз, при сохранении 80–90 % от исходной скорости. Это соотношение стало ключевым аргументом в пользу принятия Fortran в крупных расчётных центрах — Ливерморской национальной лаборатории, Лос-Аламосе, НАСА.
Раннее распространение и научный императив
К 1958 году FORTRAN I был портирован на IBM 709, а затем — на IBM 1401 и IBM 7090. Благодаря открытой публикации Report on the Algorithmic Language FORTRAN (апрель 1957), другие производители (включая Univac, Honeywell) начали создавать собственные реализации. Язык быстро стал де-факто стандартом для научных вычислений. Важно отметить, что его успех был не следствием маркетинга, а результатом соответствия предметной области: математики и физики, не будучи профессиональными программистами, могли, прочитав десяток страниц руководства, написать программу, реализующую, например, метод конечных разностей для уравнения теплопроводности.
Fortran стал языком, на котором:
- рассчитывались траектории первых спутников и пилотируемых миссий (Mercury, Apollo);
- моделировались ядерные реакции в проекте Manhattan и последующих программах;
- создавались первые численные модели атмосферы (например, работа Чарльза Льюиса и Джозефа Смажера в 1950‑х, положившая начало современной метеорологии);
- решались задачи квантовой химии — метод Хартри–Фока, программный комплекс GAUSSIAN, первоначально написанный на Fortran IV.
Этот «научный императив» определял дальнейшую эволюцию языка: каждая новая версия сохраняла обратную совместимость — не как дань традиции, а как требование непрерывности вычислительного знания. Алгоритмы, разработанные в 1960‑х, продолжали использоваться в 1990‑х и 2000‑х годах; изменение языка не должно было нарушать их работоспособность.
FORTRAN II и FORTRAN IV: консолидация и первые расширения
Несмотря на успех FORTRAN I, в нём отсутствовали средства для модульной разработки: подпрограммы не могли вызывать друг друга рекурсивно (стека не было), не было механизма передачи массивов с динамическими границами, не поддерживались символические операции.
FORTRAN II (1958) ввёл:
- возможность независимой компиляции подпрограмм — каждая
FUNCTIONилиSUBROUTINEмогла компилироваться отдельно, после чего линковаться в единый образ. Это стало основой для создания библиотек численных процедур — например, IMSL (International Mathematics and Statistics Library), появившейся в 1970 году. - директивы компилятора (
*в первом столбце строки), что позволило встраивать в исходный текст инструкции для оптимизации (например, указание на выравнивание массивов).
FORTRAN IV (1962) — ключевой этап консолидации. В нём были устранены некоторые «странности» FORTRAN I, сделавшие язык практичнее для широкого круга задач:
- Введён тип
COMPLEXдля работы с комплексными числами — критически важный для квантовой механики и электродинамики. - Появился оператор
LOGICAL IF— упрощённая форма ветвления:IF (X .GT. 0.0) GOTO 100 - Добавлены встроенные функции (
SIN,COS,EXP,SQRT,LOG), реализованные на ассемблере и гарантирующие максимальную точность и скорость. - Устранён трёхветвистый
IFкак обязательный — хотя он сохранялся как опция. - Добавлена поддержка форматированного ввода/вывода (
FORMAT), что позволило гибко управлять представлением чисел в текстовых файлах — необходимость для обмена данными между лабораториями.
К 1966 году FORTRAN IV стал основой для первого официального стандарта ANSI X3.9-1966, закрепившего язык как платформенно‑независимую сущность. С этого момента развитие Fortran перестало быть прерогативой IBM и перешло в руки международных комитетов (ANSI, позже — ISO/IEC JTC1/SC22/WG5).